require 'spaceship'
require 'spaceship/tunes/tunes'
require_relative 'module'
require_relative 'available_default_languages'

module Produce
  class ItunesConnect
    def run
      @full_bundle_identifier = app_identifier
      @full_bundle_identifier.gsub!('*', Produce.config[:bundle_identifier_suffix].to_s) if wildcard_bundle?

      Spaceship::Tunes.login(Produce.config[:username], nil)
      Spaceship::Tunes.client.select_team

      create_new_app
    end

    def create_new_app
      application = fetch_application
      if application
        UI.success("[iTC] App '#{Produce.config[:app_identifier]}' already exists (#{application.apple_id}), nothing to do on iTunes Connect")
        # Nothing to do here
      else
        UI.success("Creating new app '#{Produce.config[:app_name]}' on iTunes Connect")

        Produce.config[:bundle_identifier_suffix] = '' unless wildcard_bundle?
        generated_app = Spaceship::Tunes::Application.create!(name: Produce.config[:app_name],
                                                              primary_language: language,
                                                              sku: Produce.config[:sku].to_s, # might be an int
                                                              bundle_id: app_identifier,
                                                              bundle_id_suffix: Produce.config[:bundle_identifier_suffix],
                                                              company_name: Produce.config[:company_name],
                                                              platform: Produce.config[:platform],
                                                              itunes_connect_users: Produce.config[:itc_users])

        UI.crash!("Something went wrong when creating the new app on iTC") if generated_app["adamId"].to_s.empty?

        application = fetch_application
        counter = 0
        while application.nil?
          counter += 1
          UI.crash!("Couldn't find newly created app on iTunes Connect - please check the website for more information") if counter == 200

          # Since 2016-08-10 iTunes Connect takes some time to actually list the newly created application
          # We have no choice but to poll to see if the newly created app is already available
          UI.message("Waiting for the newly created application to be available on iTunes Connect...")
          sleep(15)
          application = fetch_application
        end

        UI.crash!("Something went wrong when creating the new app - it's not listed in the App's list") unless application

        UI.message("Ensuring version number")
        application.ensure_version!(Produce.config[:app_version], platform: Produce.config[:platform]) if Produce.config[:app_version]

        UI.success("Successfully created new app '#{Produce.config[:app_name]}' on iTunes Connect with ID #{application.apple_id}")
      end

      return Spaceship::Tunes::Application.find(@full_bundle_identifier, mac: Produce.config[:platform] == "osx").apple_id
    end

    private

    def fetch_application
      Spaceship::Tunes::Application.find(@full_bundle_identifier)
    end

    def wildcard_bundle?
      return app_identifier.end_with?("*")
    end

    def app_identifier
      Produce.config[:app_identifier].to_s
    end

    # Makes sure to get the value for the language
    # Instead of using the user's value `UK English` spaceship should send
    # `English_UK` to the server
    def language
      @language = Produce.config[:language]

      converted = Spaceship::Tunes::LanguageConverter.from_itc_readable_to_itc(@language)
      @language = converted if converted # overwrite it with the actual value

      unless AvailableDefaultLanguages.all_languages.include?(@language)
        UI.user_error!("Please enter one of available languages: #{AvailableDefaultLanguages.all_languages}")
      end

      return @language
    end
  end
end
